Class LDAPVirtualListControl

java.lang.Object
netscape.ldap.LDAPControl
netscape.ldap.controls.LDAPVirtualListControl
All Implemented Interfaces:
Serializable, Cloneable
Direct Known Subclasses:
LdapVirtualListControl

public class LDAPVirtualListControl extends LDAPControl
Represents control data for returning paged results from a search. Example of usage, with JFC:

  // Call this to initialize the list box, whenever the search
  // conditions change.
  // "filter" may be "objectclass=person", for example
  void initListBox( String host, int port, String base, String filter ) {

  // Create list box if not already done
   if ( _dataList == null ) {
       _dataList = new JList();
       JScrollPane scrollPane = new JScrollPane(_dataList);
       add( scrollPane );
   }

   // Create a virtual data model
   vlistModel model = new vlistModel( host, port, base, filter );
   // Keep a buffer of one page before and one after
   model.setPageSize( getScrollVisibleSize() );
   _dataList.setModel( model );
  }

  // Data model to supply buffer list data
  class vlistModel extends AbstractListModel {
  vlistModel( String host, int port, String base, String filter ) {
      _base = base;
      _filter = filter;

      // Connect to the server
      try {
          _ldc = new LDAPConnection();
          System.out.println( "Connecting to " + host +
                              ":" + port );
          _ldc.connect( host, port );
      } catch ( LDAPException e ) {
          System.out.println( e );
          _ldc = null;
      }
  }

  // Called by JList to get virtual list size
    public int getSize() {
      if ( !_initialized ) {
          _initialized = true;
          _pageControls = new LDAPControl[2];
          // Paged results also require a sort control
          _pageControls[0] =
              new LDAPSortControl( new LDAPSortKey("cn"),
                                   true );
          // Do an initial search to get the virtual list size
          // Keep one page before and one page after the start
          _beforeCount = _pageSize;
          _afterCount = _pageSize;
          // Create the initial paged results control
          LDAPVirtualListControl cont =
              new LDAPVirtualListControl( "A",
                                          _beforeCount,
                                          _afterCount );
          _pageControls[1] = cont;
          _vlc = (LDAPVirtualListControl)_pageControls[1];
          getPage( 0 );
      }
      return _size;
  }

  // Get a page starting at first (although we may also fetch
  // some preceding entries)
  boolean getPage( int first ) {
      _vlc.setRange( first, _beforeCount, _afterCount );
      return getPage();
  }

  boolean getEntries() {
      // Specify necessary controls for vlv
      if ( _pageControls != null ) {
          try {
              _ldc.setOption( _ldc.SERVERCONTROLS, _pageControls );
          } catch ( LDAPException e ) {
              System.out.println( e + ", setting vlv control" );
          }
      }
      // Empty the buffer
      _entries.removeAllElements();
      // Do a search
      try {
          String[] attrs = { "cn" };
          LDAPSearchResults result =
              _ldc.search( _base,
                           LDAPConnection.SCOPE_SUB,
                           _filter,
                           attrs, false );
          while ( result.hasMoreElements() ) {
              LDAPEntry entry = (LDAPEntry)result.nextElement();
              LDAPAttribute attr = entry.getAttribute( attrs[0] );
              if ( attr != null ) {
                  Enumeration en = attr.getStringValues();
                  while( en.hasMoreElements() ) {
                      String name = (String)en.nextElement();
                      _entries.addElement( name );
                  }
              }
          }
      } catch ( LDAPException e ) {
          System.out.println( e + ", searching" );
          return false;
      }
      return true;
  }

  // Fetch a buffer
  boolean getPage() {
      // Get the actual entries
      if ( !getEntries() )
          return false;

      // Check if we have a control returned
      LDAPControl[] c = _ldc.getResponseControls();
      LDAPVirtualListResponse nextCont = null;
      for ( int i = 0; i < c.length; i++ ) {
          if ( c[i] instanceof LDAPVirtualListResponse ) {
              nextCont = (LDAPVirtualListResponse)c[i];
              break;
          }
      }
      if ( nextCont != null ) {
          _selectedIndex = nextCont.getFirstPosition() - 1;
          _top = Math.max( 0, _selectedIndex - _beforeCount );
          // Now we know the total size of the virtual list box
          _size = nextCont.getContentCount();
          _vlc.setListSize( _size );
      } else {
          System.out.println( "Null response control" );
      }
      return true;
  }

  // Called by JList to fetch data to paint a single list item
    public Object getElementAt(int index) {
      if ( (index < _top) || (index >= _top + _entries.size()) ) {
          getPage( index );
      }
      int offset = index - _top;
      if ( (offset < 0) || (offset >= _entries.size()) )
          return new String( "No entry at " + index );
      else
          return _entries.elementAt( offset );
  }

  // Called by application to find out the virutal selected index
    public int getSelectedIndex() {
      return _selectedIndex;
  }

  // Called by application to find out the top of the buffer
    public int getFirstIndex() {
      return _top;
  }

  public void setPageSize( int size ) {
      _pageSize = size;
  }

  Vector _entries = new Vector();
  protected boolean _initialized = false;
  private int _top = 0;
  protected int _beforeCount;
  protected int _afterCount;
  private int _pageSize = 10;
  private int _selectedIndex = 0;
  protected LDAPControl[] _pageControls = null;
  protected LDAPVirtualListControl _vlc = null;
  protected int _size = -1;
  private String _base;
  private String _filter;
  private LDAPConnection _ldc;
  }
 

   VirtualListViewRequest ::= SEQUENCE {
            beforeCount    INTEGER (0 .. maxInt),
            afterCount     INTEGER (0 .. maxInt),
            CHOICE {
                byIndex [0] SEQUENCE {
                    index           INTEGER,
                    contentCount    INTEGER
                }
                byFilter [1] jumpTo    Substring
            },
            contextID     OCTET STRING OPTIONAL
  }
 
Version:
1.0
See Also:
  • Field Details

    • VIRTUALLIST

      public static final String VIRTUALLIST
      See Also:
    • TAG_BYINDEX

      private static final int TAG_BYINDEX
      See Also:
    • TAG_BYFILTER

      private static final int TAG_BYFILTER
      See Also:
    • m_beforeCount

      private int m_beforeCount
    • m_afterCount

      private int m_afterCount
    • m_listIndex

      private int m_listIndex
    • m_listSize

      private int m_listSize
    • m_context

      private String m_context
  • Constructor Details

    • LDAPVirtualListControl

      LDAPVirtualListControl()
      Blank constructor for internal use in LDAPVirtualListControl.
      See Also:
    • LDAPVirtualListControl

      public LDAPVirtualListControl(String jumpTo, int beforeCount, int afterCount)
      Constructs a new LDAPVirtualListControl object. Use this constructor on an initial search operation, specifying the first entry to be matched, or the initial part of it.
      Parameters:
      jumpTo - an LDAP search expression defining the result set
      beforeCount - the number of results before the top/center to return per page
      afterCount - the number of results after the top/center to return per page
      See Also:
    • LDAPVirtualListControl

      public LDAPVirtualListControl(String jumpTo, int beforeCount, int afterCount, String context)
    • LDAPVirtualListControl

      public LDAPVirtualListControl(int startIndex, int beforeCount, int afterCount, int contentCount)
      Constructs a new LDAPVirtualListControl object. Use this constructor on a subsquent search operation, after we know the size of the virtual list, to fetch a subset.
      Parameters:
      startIndex - the index into the virtual list of an entry to return
      beforeCount - the number of results before the top/center to return per page
      afterCount - the number of results after the top/center to return per page
      See Also:
    • LDAPVirtualListControl

      public LDAPVirtualListControl(int startIndex, int beforeCount, int afterCount, int contentCount, String context)
  • Method Details

    • setRange

      public void setRange(int startIndex, int beforeCount, int afterCount)
      Sets the starting index, and the number of entries before and after to return. Apply this method to a control returned from a previous search, to specify what result range to return on the next search.
      Parameters:
      startIndex - the index into the virtual list of an entry to return
      beforeCount - the number of results before startIndex to return per page
      afterCount - the number of results after startIndex to return per page
      See Also:
    • setRange

      public void setRange(String jumpTo, int beforeCount, int afterCount)
      Sets the search expression, and the number of entries before and after to return.
      Parameters:
      jumpTo - an LDAP search expression defining the result set return.
      beforeCount - the number of results before startIndex to return per page
      afterCount - the number of results after startIndex to return per page
      See Also:
    • getIndex

      public int getIndex()
      Gets the size of the virtual result set.
      Returns:
      the size of the virtual result set, or -1 if not known.
    • getListSize

      public int getListSize()
      Gets the size of the virtual result set.
      Returns:
      the size of the virtual result set, or -1 if not known.
    • setListSize

      public void setListSize(int listSize)
      Sets the size of the virtual result set.
      Parameters:
      listSize - the virtual result set size
    • getBeforeCount

      public int getBeforeCount()
      Gets the number of results before the top/center to return per page.
      Returns:
      the number of results before the top/center to return per page.
    • getAfterCount

      public int getAfterCount()
      Gets the number of results after the top/center to return per page.
      Returns:
      the number of results after the top/center to return per page.
    • getContext

      public String getContext()
      Gets the optional context cookie.
      Returns:
      the optional context cookie.
    • setContext

      public void setContext(String context)
      Sets the optional context cookie.
      Parameters:
      context - the optional context cookie
    • createPageSpecification

      private byte[] createPageSpecification(String subFilter, int beforeCount, int afterCount)
      Creates a "flattened" BER encoding of the requested page specifications and return it as a byte array.
      Parameters:
      subFilter - filter expression for generating the results
      beforeCount - number of entries before first match to return
      afterCount - number of entries after first match to return
      Returns:
      the byte array of encoded data.
    • createPageSpecification

      private byte[] createPageSpecification(int listIndex, int listSize, int beforeCount, int afterCount)
      Creates a "flattened" BER encoding of the requested page specifications and return it as a byte array.
      Parameters:
      listIndex - the center or starting entry to return
      listSize - the virtual list size
      beforeCount - number of entries before the first match to return
      afterCount - number of entries after the first match to return
      Returns:
      the byte array of encoded data.
    • toString

      public String toString()
      Description copied from class: LDAPControl
      Return a string representation of the control for debugging
      Overrides:
      toString in class LDAPControl
      Returns:
      a string representation of the control.